package de.syfy.project.engine.interfaces;

import de.syfy.project.engine.Sprite;
import de.syfy.project.engine.Tile;
import de.syfy.project.utils.Tupel;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.io.Serializable;
import java.util.List;

/**
 *
 * @author Timo
 * 
 * World repräsentiert die Spielwelt (nicht die Anzeige).
 * 
 * X bzw. Y 0 Koordinaten sind unten Links in der Ecke.
 * 
 * Hier stellt sich die Frage:
 *         - X/Y 0 Koordinaten in der Mitte und dann negative Werte erlauben?
 * 
 * Ist eine Unterklasse von Serializable um diese Welt auch abspeichern zu können.
 * 
 */
public interface World extends Serializable{
    
    public void initialize();
    
    public void initializeSprites();
    
    public Dimension getSize();
    
    public void setActualCoordinate(Point2D.Float p);
    
    public Point2D.Float getActualCoordinate();
    
    /*
     * getGridForPoint gibt die Grid-Koordinate für den gegebenen Punkt
     * zurück.
     */
    public Tupel<Integer,Integer> getGridForPoint(Point2D.Float p);
    
    /*
     * Fügt ein Sprite-Objekt der Welt hinzu.
     */
    public void addSprite(Sprite s);
    
    /*
     * Bevorzugt ArrayList.
     * 
     * Gibt alle Sprites, die in dieser Welt vorhanden sind zurück.
     * (Jedeglich eine Kopie, um Asynchronität der Threads zu vermeiden!)
     */
    public List<Sprite> getSpritesCopy();
    
    /*
     * Übergibt ein Sprite um das nächstliegende Sprite zufinden.
     */
    public Sprite getNearestSprite(Sprite s);
    
    /*
     * Gibt alle Sprites in einer gewissen Entfernung von einem Sprite zurück.
     */
    public List<Sprite> getSpritesInRange(Sprite s, float r);
    
    /*
     * Gibt alle Sprites in einer gewissen Entfernung von einem Punkt zurück.
     */
    public List<Sprite> getSpritesInRange(Point2D.Float p, float r);
    
    /*
     * Reine Debug-Methode!
     * Zeichnet das Grid-Netz über die Welt.
     */
    public void drawGrid();
    
    
    /*
     * Zeichnet die Tiles, die zur Zeit zu sehen sind.
     */
    public void drawWorld();
    
    /*
     * Zeichnet alle Sprite-Objekte auf die Oberfläche.
     * Nach drawWorld() aufrufen!
     */
    public void drawSprites(long delta);
    
    /*
     * Gibt eine Referenz zu dem Tile an dem ausgewählten Punkt zurück.
     */
    public Tile getTileForPoint(Point2D.Float p);
}
